<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>文档</title>
  <link href="../css/semantic/semantic.min.css" rel="stylesheet">
  <link href="../css/markdown.css" rel="stylesheet">
  <link href="../css/wtxynavigation.css" rel="stylesheet">
  <script src="../js/jquery.min.js"></script>
  <script type="text/javascript" src="../js/include.js"></script>
  <style>
    body{padding-top:0;background:#f7f7f7}
    body>.ui.container{width:100%;padding:0}
    #project-title{background:#6e6e6e;width:100%;line-height:3.572rem;color:#fff;font-size:1.2rem}
    #project-title .title-wrap{font-weight:700;padding:0 12px;width:100%;max-width:1366px!important;min-width:900px;margin:0 auto}
    #project-title .left,#project-title right{display:inline-block}
    #project-title .right{float:right}
    #project-title .right .wiki-actions .menu{left:auto;right:0;margin-top:.4em!important}
    #wiki-preview-container{width:100%;max-width:1366px!important;min-width:900px;padding:0;border:1px solid #e3e9ed;border-top:0}
    #wiki-preview>.ui.segment{margin-top:0;padding:1rem;padding-left:0;border:0}
    .hover-places{display:inline-block}
    #page-detail{width:60%;margin:0 auto}
    #page-detail .title{font-weight:700;font-size:24px;padding:12px 0;border-bottom:1px solid #ccc}
    #page-detail .content{margin-top:15px}
    .content p{word-wrap:break-word}
    #wiki-parent,#wiki-title,#wikis{display:none}
    .ui.grid{padding:0!important}
    #ex-all{cursor:pointer;color:#537c8d}
  </style>
</head>
<body>
  <div class="ui container">
    <div id="project-title">
      <div class="title-wrap">
        <div class="left">
          <i class="icon eye"></i>
          文档预览:
          mianmSDK
        </div>
        <div class="right">
          Export by Gitee
        </div>
      </div>
    </div>

    <div class="ui container" id="wiki-preview-container">
      <div id="wiki-preview">
        <div class="ui segment">
          <div id="page-detail" class="markdown-body">
            <div class='title'>31.runloop是啥</div><div class='content'><h1>
<a id="啥是runloop" class="anchor" href="#%E5%95%A5%E6%98%AFrunloop"></a>啥是runloop?</h1>
<p><strong>关键词</strong>: <code>runloop</code>, <code>事件循环</code>, <code>事件</code>,<code>消息</code></p>
<h2>
<a id="描述" class="anchor" href="#%E6%8F%8F%E8%BF%B0"></a>描述</h2>
<h3>
<a id="1" class="anchor" href="#1"></a>1.</h3>
<h1>
<a id="答" class="anchor" href="#%E7%AD%94"></a>答:</h1>
<p><strong>Runloop</strong>是通过内部维护的<strong>事件循环</strong>来对<strong>事件/消息进行管理</strong>的一个<code>对象</code>.</p>
<h1>
<a id="我们的main函数为什么不退出" class="anchor" href="#%E6%88%91%E4%BB%AC%E7%9A%84main%E5%87%BD%E6%95%B0%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E9%80%80%E5%87%BA"></a>我们的main函数为什么不退出?</h1>
<h1>
<a id="答-1" class="anchor" href="#%E7%AD%94-1"></a>答:</h1>
<ol>
<li>因为<code>main</code>里面调用了<code>UIApplicationMain</code>
</li>
<li>
<code>UIApplicationMain</code>里面就有一个运行循环, 就是<code>runloop</code>
</li>
<li>
<code>UIApplicationMain</code>你调用它了, 它会启动主线程的<code>runloop</code>
</li>
<li>
<code>runloop</code>它能做到有事的时候做事, 没事的时候就从<strong>用户态</strong> 切换到 <strong>内核态</strong>,避免资源占用.当前线程处于休眠状态.</li>
</ol>
<h2>
<a id="1-那什么是事件循环" class="anchor" href="#1-%E9%82%A3%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF"></a>1. 那什么是事件循环?</h2>
<h2>
<a id="答-2" class="anchor" href="#%E7%AD%94-2"></a>答:</h2>
<ol>
<li>没有消息需要处理时, 休眠以避免资源占用</li>
</ol>
<p><strong>用户态</strong>---经过系统调用进入---&gt;<strong>内核态</strong></p>
<ul>
<li>将线程的控制权交给了内核态</li>
</ul>
<p><img src="images/runloopa1.png" alt="runloopa1"></p>
<ol start="2">
<li>有消息需要处理时, 立刻被唤醒</li>
</ol>
<p><strong>内核态</strong>------&gt;<strong>用户态</strong>
<img src="images/runloopa2.png" alt="runloopa2"></p>
<ol start="3">
<li>总结: 维护的事件循环, 可以不断的处理消息事件, 对它们进行管理.</li>
</ol>
<ul>
<li>然后没有消息需要处理的时候, 会从用户态到内核态的一个切换来进行当前线程的休眠, 避免资源占用</li>
<li>当有消息需要处理时, 就从<strong>内核态</strong>---切换到---&gt;<strong>用户态</strong>, 唤醒当前线程.</li>
</ul>
<h2>
<a id="2-用户态和内核态说明" class="anchor" href="#2-%E7%94%A8%E6%88%B7%E6%80%81%E5%92%8C%E5%86%85%E6%A0%B8%E6%80%81%E8%AF%B4%E6%98%8E"></a>2. 用户态和内核态说明</h2>
<ol>
<li>我们的应用程序一般是运行再用户态上面的</li>
<li>当我们发生了系统调用, 调用一些操作系统呀, 底层内核什么的,底层API的时候,就可能发生空间切换,切换到<strong>内核态</strong>
</li>
<li>之所以区分<strong>用户态</strong>和<strong>内核态</strong>实际上是对计算机的资源调度,包括资源管理,做一个统一, 一致性的操作. 这样区分可以进行一个合理的资源调度. 像开机关机什么的,这些操作就不能给<strong>用户态</strong>
</li>
<li>
</li>
</ol></div>
          </div>
        </div>
      </div>
      </div>
  </div>
</body>
</html>